#ifndef __HASH_MAP_H__
#define __HASH_MAP_H__
#include <stdint.h>
#include "../../../../log/systemLog/systemLog.h"

// 哈希节点
typedef struct hash_node_s
{
    int fd;                    // 文件描述符 key
    intptr_t ring_queue_index; // 环形队列索引 value 或其他指针数据
    struct hash_node_s *next;  // 指向下一个哈希节点的指针
} hash_node_t;

// 哈希表
typedef struct hash_map_s
{
    hash_node_t **buckets; // 哈希桶数组
    int size;              // 哈希表大小
    int count;             // 哈希表中的元素数量
    uint32_t seed;         // 哈希种子 时间戳
} hash_map_t;

/**
 * @brief 初始化哈希表
 *
 * @param map 需要初始化的哈希表
 * @param size 哈希表大小
 * @return system_error_code_t 初始化结果
 */
system_error_code_t hash_map_init(hash_map_t *map, int size);

/**
 * @brief 从哈希表中获取文件描述符对应的环形队列索引
 *
 * @param map 哈希表
 * @param fd 文件描述符 key
 * @param out_ring_queue_index 环形队列索引 value 输出参数
 * @return system_error_code_t 查找结果
 */
system_error_code_t hash_map_get(hash_map_t *map, int fd, intptr_t *out_ring_queue_index);

/**
 * @brief 向哈希表中插入文件描述符和对应的环形队列索引
 *
 * @param map 哈希表
 * @param fd 文件描述符 key
 * @param ring_queue_index 环形队列索引 value
 * @return system_error_code_t 插入结果
 */
system_error_code_t hash_map_put(hash_map_t *map, int fd, intptr_t ring_queue_index);

/**
 * @brief 从哈希表中移除指定文件描述符的节点
 *
 * @param map 哈希表
 * @param fd 文件描述符 key
 * @return system_error_code_t 移除结果
 */
system_error_code_t hash_map_remove(hash_map_t *map, int fd);

#endif // __HASH_MAP_H__